package cn.lcvc.xnc.application.common.utils.page;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * 分页类，需要配合数据库实现分页。
 * 说明：该工具类主要用于计算出页码，然后手动去数据库中获取相关的数据集。不适用于针对指定集合直接进行分页
 * @author ljy
 * 20220129最后修改
 */
@Data
@ApiModel(value="分页对象")
public class Pagination<T> {
	@ApiModelProperty(value="每页显示的记录数")
	private int pageSize;
	@ApiModelProperty(value="显示的最大页数")
	private int maxPage;
	@ApiModelProperty(value="显示当前页数")
	private int page;
	@ApiModelProperty(value="总记录数")
	private int totalRecords;
	@ApiModelProperty(value="下一页的页数数")
	private int nextPage;
	@ApiModelProperty(value="上一页的页数")
	private int previousPage;
	@ApiModelProperty(value="当前页的记录集合")
	private List<T> data;

	//用于数据库的指针树形
	@ApiModelProperty(hidden = true)
	@JsonIgnore//Json不返回该属性
	private int offset;//获取当前页起始记录位置，从0开始

	/**
	 * 进行分页初始化
	 * 说明：
	 * 要求同时完成分页中相关属性的计算
	 * @param page 当前页
	 * @param pageSize 每页记录数
	 * @param totalRecords  总记录数，一般应将数据库中查询结果的总记录数放入
	 */
	public Pagination(Integer page,Integer pageSize , int totalRecords){
		if(pageSize==null){
			pageSize=20;//默认20条记录
		}
		//赋值每页记录数
		this.setPageSize(pageSize);
		//赋值最大记录数
		this.setTotalRecords(totalRecords);
		//赋值当前页的记录集合
		this.setData(data);
		//根据总记录数和每页最大记录数计算并获得最大页数，并赋值
		this.maxPage = ((totalRecords % pageSize) == 0)?(totalRecords / pageSize):(totalRecords / pageSize + 1);
		if(maxPage==0){//一般出现在记录数为0的情况
			maxPage=1;
		}
		//计算当前页，并赋值
		if(page==null){//如果page为null,默认为第一页
			page=1;
		}else{
			if (page < 1) {//如果有些人故意输入的页数小于1，或者小于0，则指向第一页
				page = 1;
			} else if(page > maxPage){//如果输入的页数超过了最大页数，则指向最大页。
				page = maxPage;
			}
		}
		this.setPage(page);
		//计算当前游标（数据库结果集）位置
		int offset=(this.getPage() - 1) * this.getPageSize();//移动指针到要显示的记录位置上,注意 集合位置从0开始，所以 计算方式不同
		this.setOffset(offset);
		//设置上一页
		previousPage=this.getPage()-1;
		if(previousPage<1){
			previousPage=1;
		}
		this.setPreviousPage(previousPage);
		//设置下一页
		nextPage=this.getPage()+1;
		if(nextPage>this.getMaxPage()){
			nextPage=this.getMaxPage();
		}
		this.setNextPage(nextPage);
	}
}
